/**
 * @file exceptions.h
 * @brief 异常类定义 - KWDB SDK异常处理
 */

#ifndef KWDB_EXCEPTIONS_H
#define KWDB_EXCEPTIONS_H

#include <stdexcept>
#include <string>

namespace kwdb {

/**
 * @brief KWDB基础异常类
 */
class KWDBException : public std::runtime_error {
public:
    /**
     * @brief 构造函数
     * @param message 异常消息
     */
    explicit KWDBException(const std::string& message);
    
    /**
     * @brief 构造函数
     * @param message 异常消息
     * @param cause 原因异常
     */
    KWDBException(const std::string& message, const std::exception& cause);
    
    /**
     * @brief 获取错误代码
     * @return 错误代码
     */
    const std::string& getErrorCode() const;
    
    /**
     * @brief 设置错误代码
     * @param errorCode 错误代码
     */
    void setErrorCode(const std::string& errorCode);

private:
    std::string errorCode_;
};

/**
 * @brief 连接异常
 */
class ConnectionException : public KWDBException {
public:
    explicit ConnectionException(const std::string& message);
    ConnectionException(const std::string& message, const std::exception& cause);
};

/**
 * @brief 写入异常
 */
class WriteException : public KWDBException {
public:
    explicit WriteException(const std::string& message);
    WriteException(const std::string& message, const std::exception& cause);
};

/**
 * @brief 查询异常
 */
class QueryException : public KWDBException {
public:
    explicit QueryException(const std::string& message);
    QueryException(const std::string& message, const std::exception& cause);
};

/**
 * @brief 解析异常
 */
class ParseException : public KWDBException {
public:
    explicit ParseException(const std::string& message);
    ParseException(const std::string& message, const std::exception& cause);
};

/**
 * @brief 配置异常
 */
class ConfigException : public KWDBException {
public:
    explicit ConfigException(const std::string& message);
    ConfigException(const std::string& message, const std::exception& cause);
};

/**
 * @brief 超时异常
 */
class TimeoutException : public KWDBException {
public:
    explicit TimeoutException(const std::string& message);
    TimeoutException(const std::string& message, const std::exception& cause);
};

/**
 * @brief 认证异常
 */
class AuthenticationException : public KWDBException {
public:
    explicit AuthenticationException(const std::string& message);
    AuthenticationException(const std::string& message, const std::exception& cause);
};

/**
 * @brief 权限异常
 */
class PermissionException : public KWDBException {
public:
    explicit PermissionException(const std::string& message);
    PermissionException(const std::string& message, const std::exception& cause);
};

/**
 * @brief 资源异常
 */
class ResourceException : public KWDBException {
public:
    explicit ResourceException(const std::string& message);
    ResourceException(const std::string& message, const std::exception& cause);
};

} // namespace kwdb

#endif // KWDB_EXCEPTIONS_H
